package com.gradumate.client.gui;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.RootPanel;
import com.gradumate.client.Element;
import com.gradumate.client.GraduMate;
import com.gradumate.client.service.GraduMateService;
import com.gradumate.client.service.GraduMateServiceAsync;
import com.gradumate.shared.Gebruiker;

/**
 * @author Hugo Zonderland
 * 
 *         Op deze pagina staan alle afstudeerverzoeken. De verzoeken worden
 *         allemaal uit Alfresco opgehaald. De studieadviseur heeft toegang tot
 *         de pagina en kan uit de lijst een student kiezen en vervolgens via
 *         een detail pagina het verzoek goedkeuren. Na goedkeuring van het
 *         verzoek word er een bericht gestuurd naar de afstudeercommissie die
 *         aangeeft dat het verzoek is goed gekeurd en dat de commissie mag
 *         beginnen met het beoordelen van het afstudeervoorstel.
 * 
 * @see com.gradumate.client.gui.StudieAdviseurAfstudeerVerzoekDetail;
 * 
 */
public class StudieAdviseurAfstudeerVerzoekLijst {

	// Asyncserver
	private GraduMateServiceAsync server = GWT.create(GraduMateService.class);

	// Logger
	private final Logger log = Logger
			.getLogger(StudieAdviseurAfstudeerVerzoekLijst.class.getName());

	// Element
	private Element element = new Element();

	// Table
	private FlexTable table;
	private int row;

	public StudieAdviseurAfstudeerVerzoekLijst() {
		// Loading-gif plaatsen.
		GraduMate.setLoadingImage(true);
		GraduMate.clearStatusMessages();

		// Overzicht met afstudeerverzoeken ophalen.
		server.getAfstudeerVerzoekOverzicht(new AsyncCallback<ArrayList<Gebruiker>>() {

			public void onFailure(Throwable caught) {
				log.info("Service failure -> getAfstudeerVerzoekOverzicht() -> " + caught.getMessage());
				
				// Loading gif uit
				GraduMate.setLoadingImage(false);
				GraduMate.addAsyncError();
			}

			public void onSuccess(ArrayList<Gebruiker> studenten) {
				createForm(studenten);
			}
		});
	}

	/**
	 * Verwerkt de data, maakt het formulier aan en plaatst die op de RootPanel.
	 * 
	 * @param ArrayList
	 *            <Gebruiker> studenten die nog een onbeoordeeld
	 *            afstudereverzoek hebben.
	 */
	private void createForm(ArrayList<Gebruiker> studenten) {

		// Flextable opnieuw aanmaken
		FlexTable hTable = new FlexTable();
		hTable.setStyleName("datatableNoBorder");

		// Header op het panel plaatsen.
		hTable.setWidget(0, 0, element.getHeaderLabel("Overzichtslijst afstudeerverzoeken"));

		// Table aanmaken
		table = new FlexTable();
		table.setStyleName("datatable");
		table.setCellSpacing(0);
		table.setCellPadding(0);
		row = 0;

		// Header van de tabel aanmaken
		table.setWidget(row, 0, element.getDataTableHeaderLabel("Student"));
		table.setWidget(row, 1, element.getDataTableHeaderLabel("Opties"));
		row++;

		// Controleren of er wel sites zijn.
		if (studenten != null && !studenten.isEmpty()) {
			// Door de sites heenlopen en ze aan de tabel toevoegen
			for (final Gebruiker student : studenten) {

				table.setWidget(row, 0, element.getLabel(student.getVoornaam() + " " + student.getAchternaam()));
				Image imgRow = element.getImage("Ga naar", "folder_go.png");

				// Clickable image moet doorverwijzen naar een detail pagina
				imgRow.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent e) {
						new StudieAdviseurAfstudeerVerzoekDetail(student, null);
					}
				});
				// Toevoegen aan de table
				table.setWidget(row, 1, imgRow);
				row++;
			}

		} else {
			// Bericht op het scherm droppen
			GraduMate.addInformationMsg("Er zijn geen afstudeerverzoeken die beoordeeld moeten worden.");
		}

		// Laadimage uit
		GraduMate.setLoadingImage(false);

		// Rootpanel schoonvegen en tabellen erop zetten
		RootPanel.get("main").clear();
		RootPanel.get("main").add(hTable);
		RootPanel.get("main").add(table);
	}
}
